// 图片处理工具函数
import { useGlobSetting } from '/@/hooks/setting';

const glob = useGlobSetting();

/**
 * 格式化图片URL - 添加域名前缀用于显示
 * @param imagePath 图片路径
 * @returns 完整的图片URL
 */
export function formatImageUrl(imagePath: string | undefined | null): string {
  if (!imagePath) {
    return '';
  }

  // 如果已经是完整URL，直接返回
  if (imagePath.startsWith('http://') || imagePath.startsWith('https://')) {
    return imagePath;
  }

  // 添加域名前缀
  return glob.viewUrl + imagePath;
}

/**
 * 清理图片URL - 去掉域名前缀用于提交
 * @param imageUrl 完整的图片URL
 * @returns 相对路径
 */
export function cleanImageUrl(imageUrl: string | undefined | null): string {
  if (!imageUrl) {
    return '';
  }

  // 去掉域名前缀
  if (imageUrl.startsWith(glob.viewUrl)) {
    return imageUrl.replace(glob.viewUrl, '');
  }

  return imageUrl;
}

/**
 * 批量格式化图片URL数组
 * @param imagePaths 图片路径数组
 * @returns 完整URL数组
 */
export function formatImageUrls(imagePaths: (string | undefined | null)[]): string[] {
  return imagePaths.map((path) => formatImageUrl(path)).filter(Boolean);
}

/**
 * 批量清理图片URL数组
 * @param imageUrls 完整URL数组
 * @returns 相对路径数组
 */
export function cleanImageUrls(imageUrls: (string | undefined | null)[]): string[] {
  return imageUrls.map((url) => cleanImageUrl(url)).filter(Boolean);
}

/**
 * 处理表单数据中的图片字段
 * @param data 表单数据
 * @param imageFields 图片字段名数组
 * @param action 'format' | 'clean' - 格式化用于显示，清理用于提交
 * @returns 处理后的数据
 */
export function processImageFields(data: Record<string, any>, imageFields: string[], action: 'format' | 'clean' = 'format'): Record<string, any> {
  const result = { ...data };

  imageFields.forEach((field) => {
    if (result[field]) {
      if (Array.isArray(result[field])) {
        // 处理数组类型的图片字段
        result[field] = action === 'format' ? formatImageUrls(result[field]) : cleanImageUrls(result[field]);
      } else {
        // 处理单个图片字段
        result[field] = action === 'format' ? formatImageUrl(result[field]) : cleanImageUrl(result[field]);
      }
    }
  });

  return result;
}

/**
 * 验证图片文件类型
 * @param file 文件对象
 * @param allowedTypes 允许的文件类型
 * @returns 是否有效
 */
export function validateImageType(file: File, allowedTypes: string[] = ['image/jpeg', 'image/png', 'image/gif', 'image/webp']): boolean {
  return allowedTypes.includes(file.type);
}

/**
 * 验证图片文件大小
 * @param file 文件对象
 * @param maxSize 最大文件大小（字节）
 * @returns 是否有效
 */
export function validateImageSize(file: File, maxSize: number = 2 * 1024 * 1024): boolean {
  return file.size <= maxSize;
}

/**
 * 获取图片预览URL
 * @param file 文件对象
 * @returns Promise<string> 预览URL
 */
export function getImagePreviewUrl(file: File): Promise<string> {
  return new Promise((resolve, reject) => {
    const reader = new FileReader();
    reader.onload = (e) => {
      resolve(e.target?.result as string);
    };
    reader.onerror = reject;
    reader.readAsDataURL(file);
  });
}
